import Lex
import Draw
import Stms


#传入tokens
def testCode(tokens):
  #程序入口寻找
  if not(len(tokens)>5 and tokens[0][1]=="main" and tokens[1][1]=="(" and tokens[2][1]==")"):
      raise Exception("error:[pre] 无法在开头找到程序入口!")
  #获取一个语法单元
  retDict1=Stms.getCodeUnit(tokens)
  #碰到的第一个语法单元必须是Block 
  if retDict1["status"]==2:
    if len(retDict1["new"]) ==0:  #最外层block后不能有其他token
      retDict2=Stms.testBlock(retDict1["need"])
      if not retDict2["status"]:
        raise Exception("error:未知异常发生!")
      needTree={"root":["ProgStart",[[3,"main"],[1,"("],[1,")"]]],"leafA":retDict2["needTree"]}
      return needTree
    else:
      raise Exception("error:[pre] 在}后,在"+retDict1["new"][0][1]+"之前发现错误,在根语法块之后的非法字符")
  else:
    raise Exception("error:[pre] 直到文本尾部,未能找到合适的语法块")


def getCode():
  code=""
  tid=input("请选择您的输入方式(0键盘输入|others文件输入):")
  if tid=='0':
    code=input("请输入待检测代码:")
  else:
    fileName=input("请输入代码文件名:")
    with open(fileName,'r') as f:
      code=f.readlines()
  return code



if __name__ == "__main__":
  try:
    #1.获取待检测代码
    code=getCode()
    #2.送入词法分析器 得到词汇token
    tokens=Lex.process(code)
    print("[词法分析结果]:"+str(tokens))
    print("[词数]:"+str(len(tokens)))
    #3.进行代码分析
    treeDict=testCode(tokens)  
    print(treeDict)
    print("绘图中..")
    Draw.drawTree(treeDict)
    print("绘图完成")
  except Exception as e:
    print(e) 